/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package models.negocio;

import config.LogErro;
import controllers.JdbcDimController;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.HashMap;
import java.util.List;
import models.dados.HibernateDAO;
import models.dados.HibernateUtil;
import models.entidades.AtributoDimensao;
import models.entidades.Dimensao;
import models.entidades.Procedimento;
import models.entidades.RestricaoNulidade;
import org.hibernate.Criteria;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author Wenderson
 */
public class NegocioAtributoDim extends HibernateDAO<AtributoDimensao, Integer> {
    
    public NegocioAtributoDim() {
        super(AtributoDimensao.class);
    }
    
    public HashMap<String, String> getNomeTipo(Dimensao dimensao) {
        try {
            Criteria c = HibernateUtil.getSession().createCriteria(AtributoDimensao.class, "ad");
            c.createAlias("dimensao", "d", Criteria.INNER_JOIN, Restrictions.eq("d.cdDimensao", dimensao.getCdDimensao()));
            c.setProjection(Projections.projectionList()
                    .add(Projections.property("ad.nome"))
                    .add(Projections.property("ad.tipoDado")));
            
            List<Object[]> lista = c.list();

            HashMap<String, String> map = new HashMap<String, String>();
            
            for (Object[] objects : lista) {
                map.put(objects[0].toString(), objects[1].toString());
            }
            
            return map;
        } catch (Exception e) {
            LogErro.gravaErro(e);e.printStackTrace();
        }
        return null;
    }

    public String getNomeDataFinal(Procedimento procedimento) {
        try {
            String sql = "SELECT td.nome FROM Procedimento p " +
				"INNER JOIN Dimensao d ON (d.cd_dimensao = p.cd_dimensao) " +
                                "INNER JOIN Atributo_Dimensao td ON (td.cd_dimensao = d.cd_dimensao) " +
                                "INNER JOIN Data_Final df ON (df.cd_at_dimensao = td.cd_at_dimensao) " +
                                "WHERE p.cd_procedimento = ? ";
            
            String nome = HibernateUtil.getSession().createSQLQuery(sql)
                    .setInteger(0, procedimento.getCdProcedimento())
                    .uniqueResult()
                    .toString();
            
            return nome;
        } catch (Exception e) {
            LogErro.gravaErro(e);e.printStackTrace();
        }
        return null;
    }

    public String getNomeFlCorrente(Procedimento procedimento) {
        try {
            String sql = "SELECT td.nome FROM Procedimento p " +
				"INNER JOIN Dimensao d ON (d.cd_dimensao = p.cd_dimensao) " +
                                "INNER JOIN Atributo_Dimensao td ON (td.cd_dimensao = d.cd_dimensao) " +
                                "INNER JOIN Fl_Corrente fc ON (fc.cd_at_dimensao = td.cd_at_dimensao) " +
                                "WHERE p.cd_procedimento = ? ";
            
            String nome = HibernateUtil.getSession().createSQLQuery(sql)
                    .setInteger(0, procedimento.getCdProcedimento())
                    .uniqueResult()
                    .toString();
            
            return nome;
        } catch (Exception e) {
            LogErro.gravaErro(e);e.printStackTrace();
        }
        return null;
    }

    public String getNomeDataInicial(Procedimento procedimento) {
        try {
            String sql = "SELECT td.nome FROM Procedimento p " +
				"INNER JOIN Dimensao d ON (d.cd_dimensao = p.cd_dimensao) " +
                                "INNER JOIN Atributo_Dimensao td ON (td.cd_dimensao = d.cd_dimensao) " +
                                "INNER JOIN Data_Inicial di ON (di.cd_at_dimensao = td.cd_at_dimensao) " +
                                "WHERE p.cd_procedimento = ? ";
            
            String nome = HibernateUtil.getSession().createSQLQuery(sql)
                    .setInteger(0, procedimento.getCdProcedimento())
                    .uniqueResult()
                    .toString();
            
            return nome;
        } catch (Exception e) {
            LogErro.gravaErro(e);e.printStackTrace();
        }
        return null;
    }
    
    public String getNomeDtCarga(Procedimento procedimento) {
        try {
            String sql = "SELECT at.nome FROM Procedimento p " +
                        "INNER JOIN Tab_Aux ta ON (ta.cd_tab_aux = p.cd_tab_aux) " +
                        "INNER JOIN Atributo_Tab_Aux at ON (at.cd_tab_aux = ta.cd_tab_aux) " +
                        "INNER JOIN Dt_Carregamento dt ON (dt.cd_tab_aux = ta.cd_tab_aux AND at.cd_at_tab_aux = dt.cd_at_tab_aux) " +
                        "WHERE p.cd_procedimento = ? ";            
            
            String nome = HibernateUtil.getSession().createSQLQuery(sql)
                    .setInteger(0, procedimento.getCdProcedimento())
                    .uniqueResult()
                    .toString();
            
            return nome;
        } catch (Exception e) {
            LogErro.gravaErro(e);e.printStackTrace();
        }
        return null;
    }

    public int resultadoValorChaveAtributo(Procedimento procedimento, HashMap<String, String> chavesRef, ResultSet rsChaves, String nomeAtributo, Object valor) {
        try {
            int numColunas = rsChaves.getMetaData().getColumnCount();
            
            StringBuilder sb = new StringBuilder();
            sb.append("SELECT COUNT(*) ")
            .append("FROM ")
            .append(procedimento.getDimensao().getEsquema())
            .append(".")
            .append(procedimento.getDimensao().getNome())
            .append(" WHERE ");
            
            int indiceColuna = 1;
            
            for (String chaveDim : chavesRef.keySet()) {
                sb.append(chavesRef.get(chaveDim))
                .append(" = ? AND ");
                        
                indiceColuna = indiceColuna < numColunas ? ++indiceColuna : indiceColuna;
            }
            
            sb.append(nomeAtributo)
            .append(" = ?");
            
            PreparedStatement ps = JdbcDimController.getPreparedStatement(sb.toString());
            
            indiceColuna = 1;
            
            for (String chaveDim : chavesRef.keySet()) {
                ps.setObject(indiceColuna, rsChaves.getObject(indiceColuna));
                
                indiceColuna = indiceColuna < numColunas ? ++indiceColuna : indiceColuna;
            }
            
            ps.setObject(++indiceColuna, valor);
            
            ResultSet rsDim = ps.executeQuery();
            
            rsDim.next();
            
            int quantidade = rsDim.getInt(1);
            rsDim.close();
            
            return quantidade;
        } catch (Exception e) {
            LogErro.gravaErro(e);e.printStackTrace();
        }
        return -1;
    }

}
